#ifndef IMAGEUTILS_H
#define IMAGEUTILS_H
#include <stdio.h>
extern "C"{
#include <libavutil/opt.h>
#include <libavutil/time.h>
#include <libavutil/pixdesc.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include "libavutil/imgutils.h"
#include "libavcodec/avcodec.h"
#include "libavutil/pixfmt.h"
}

//AVFrame* add_watermark(AVFrame* original_frame, AVFrame* watermark_frame) {
//    AVFrame* output_frame = av_frame_alloc();

//    // 设置输出帧的像素格式和分辨率
//    output_frame->format = AV_PIX_FMT_YUV420P;
//    output_frame->width = original_frame->width;
//    output_frame->height = original_frame->height;

//    // 分配输出帧的缓冲区
//    int ret = av_frame_get_buffer(output_frame, 0);
//    if (ret < 0) {
//        av_frame_free(&output_frame);
//        return NULL;
//    }

//    // 创建sws_context并进行像素格式转换和缩放
//    struct SwsContext* sws_context = sws_getContext(watermark_frame->width, watermark_frame->height, (AVPixelFormat)watermark_frame->format, original_frame->width, original_frame->height, (AVPixelFormat)output_frame->format, SWS_BICUBIC, NULL, NULL, NULL);
//    if (!sws_context) {
//        av_frame_free(&output_frame);
//        return NULL;
//    }

//    // 将水印AVFrame缩放和转换为输出帧的格式
//    ret = sws_scale(sws_context, watermark_frame->data, watermark_frame->linesize, 0, watermark_frame->height, output_frame->data, output_frame->linesize);
//    if (ret < 0) {
//        av_frame_free(&output_frame);
//        sws_freeContext(sws_context);
//        return NULL;
//    }

//    // 在输出帧上覆盖原始图片AVFrame
//    for (int y = 0; y < original_frame->height; y++) {
//        for (int x = 0; x < original_frame->width; x++) {
//            uint8_t* p_original = original_frame->data[0] + y * original_frame->linesize[0] + x * 3;
//            uint8_t* p_watermark = output_frame->data[0] + y * output_frame->linesize[0] + x * 3;

//            // 将水印AVFrame中的像素加入到原始图片AVFrame中
//            p_original[0] = (p_original[0] + p_watermark[0]) / 2;
//            p_original[1] = (p_original[1] + p_watermark[1]) / 2;
//            p_original[2] = (p_original[2] + p_watermark[2]) / 2;
//            p_original[3] = (p_original[3] + p_watermark[3]) / 2;
//        }
//    }

//    // 释放sws_context并返回输出帧
//    sws_freeContext(sws_context);
//    return output_frame;
//}

AVFrame* av_frame_malloc(int width, int height, int format);
int save_frame_to_i420p(const char *filename, const AVFrame* frame);
int save_frame_to_jpeg(const char *filename, const AVFrame* frame);
AVFrame *get_frame_from_yuvile(const char * filename, int width, int height, int format);
AVFrame* get_frame_from_jpegfile(const char *filename);
AVFrame* convertToYUV420P(AVFrame* pFrame);
#endif // IMAGEUTILS_H
